type point = (int*int);
type path = list point;
type state = [=`Walk | `Run | `Stun | `Die ];
(*{{{*)
class type actor =
  object
    method name         :string;
    method weight       :int;
    method move_delay   :float;
    method dec_stamina  :int -> unit;
    method path         :path;
    method state        :state;
    method set_state    :state -> unit;    
    method set_path     :path -> unit;
    method set_target   :point -> unit;
    method do_step      :point -> unit;
    method p_print      :unit;
    method target       :point;   
    method attack_me    :actor -> unit;    
  end
and map =
  object
    method brd:array (array [= `Block | `Occupation of list actor]);
    method size :(int*int);
    method set_cell :(int*int) -> [= `Block | `Occupation of list actor]  -> unit;  
    method cell : (int*int) -> [= `Block | `Occupation of list actor];  
    method position: actor -> point;
    method next_step_opt: actor -> option (point*path);
    method can_next_step: actor -> bool;
    method real_move : actor ->  point -> [=`Ok | `Blocked  | `Occupied of list actor];
    method draw : unit;
  end;(*}}}*)
